package com.career.syn.util;

import org.apache.commons.lang3.StringUtils;

import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @author georgeli
 * @ClassName: DateUtil
 * @Description: 日期工具类
 * @date 2018年1月25日 下午4:58:55
 */
public class DateUtil {
    public static final String FORMAT_DATE_YMDHMS = "yyyy-MM-dd HH:mm:ss";
    public static final String FORMAT_DATE_YMD = "yyyy-MM-dd";
    public static final String FILE_FORMAT_DATE_YMD = "yyyyMMdd";
    public static final String FORMAT_DATE_YYMMDD = "yyyyMMdd";

    /**
     * @param date
     * @return String
     * @throws
     * @Title: format
     * @Description: 将Date类型转换为字符串
     * @author georgeli
     * @date 2018年1月25日 下午4:59:05
     */
    public static String format(Date date) {
        return format(date, FORMAT_DATE_YMDHMS);
    }

    /**
     * @param date
     * @param pattern
     * @return Date
     * @throws
     * @Title: convertStringToDate
     * @Description: 将字符串转换成日期
     * @author georgeli
     * @date 2018年1月25日 下午4:59:13
     */
    public static Date convertStringToDate(String date, String pattern) {
        if (date == "")
            return null;
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try {
            return sdf.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return new Date();
    }

    /**
     * @param date
     * @param pattern
     * @return String
     * @throws
     * @Title: format
     * @Description: 将Date类型转换为字符串
     * @author georgeli
     * @date 2018年1月25日 下午4:59:30
     */
    public static String format(Date date, String pattern) {
        if (date == null) {
            return "null";
        }
        if (pattern == null || pattern.equals("") || pattern.equals("null")) {
            pattern = FORMAT_DATE_YMDHMS;
        }
        return new SimpleDateFormat(pattern).format(date);
    }

    /**
     * @param date
     * @return Date
     * @throws
     * @Title: format
     * @Description: 将字符串转换为Date类型
     * @author georgeli
     * @date 2018年1月25日 下午4:59:42
     */
    public static Date format(String date) {
        return format(date, null);
    }

    /**
     * @param date
     * @param pattern
     * @return Date
     * @throws
     * @Title: format
     * @Description: 将字符串转换为Date类型
     * @author georgeli
     * @date 2018年1月25日 下午4:59:51
     */
    public static Date format(String date, String pattern) {
        if (pattern == null || pattern.equals("") || pattern.equals("null")) {
            pattern = FORMAT_DATE_YMDHMS;
        }
        if (date == null || date.equals("") || date.equals("null")) {
            return new Date();
        }
        Date d = null;
        try {
            d = new SimpleDateFormat(pattern).parse(date);
        } catch (ParseException pe) {
        }
        return d;
    }

    /**
     * @return String
     * @throws
     * @Title: getDateYmdHms
     * @Description: 得到年月日时分秒字符串
     * @author georgeli
     * @date 2018年1月25日 下午5:00:00
     */
    public static String getDateYmdHms() {
        Date date = new Date();
        SimpleDateFormat formatter1 = new SimpleDateFormat("yyyyMMddHHmmss");
        String now = formatter1.format(date);
        return now;
    }

    /**
     * @param date
     * @return Date
     * @throws
     * @Title: getNextDay
     * @Description: 得到下一天
     * @author georgeli
     * @date 2018年1月25日 下午5:00:08
     */
    public static Date getNextDay(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DAY_OF_MONTH, 1);
        date = c.getTime();
        return date;
    }

    /**
     * @param date
     * @return Date
     * @throws
     * @Title: getNextHour
     * @Description: 得到下一小时
     * @author georgeli
     * @date 2018年1月25日 下午5:00:21
     */
    public static Date getNextHour(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.HOUR_OF_DAY, 1);
        date = c.getTime();
        return date;
    }

    /**
     * @param date
     * @return Date
     * @throws
     * @Title: getPreviousMonth
     * @Description: 得到上一个月
     * @author georgeli
     * @date 2018年1月25日 下午5:00:33
     */
    public static Date getPreviousMonth(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.MONTH, -1);
        date = c.getTime();
        return date;
    }

    /**
     * @param date
     * @return Date
     * @throws
     * @Title: getPreviousWeek
     * @Description:得到上一周
     * @author georgeli
     * @date 2018年1月25日 下午5:00:47
     */
    public static Date getPreviousWeek(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DAY_OF_MONTH, -7);
        date = c.getTime();
        return date;
    }

    /**
     * @return Date
     * @throws
     * @Title: getLastDayOfMonth
     * @Description: 获得当前月的最后一天
     * @author georgeli
     * @date 2018年1月25日 下午5:01:00
     */
    public static Date getLastDayOfMonth() {
        String dateFormat = FORMAT_DATE_YMD;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        Calendar lastDate = Calendar.getInstance();
        lastDate.set(Calendar.DATE, 1);// 设为当前月的1号
        lastDate.add(Calendar.MONTH, 1);// 加一个月，变为下月的1号
        lastDate.add(Calendar.DATE, -1);// 减去一天，变为当月最后一天

        return strToDate(sdf.format(lastDate.getTime()), dateFormat);
    }

    /**
     * @return String
     * @throws
     * @Title: getLastDayOfMonthStr
     * @Description: 获得当前月的最后一天
     * @author georgeli
     * @date 2018年1月25日 下午5:01:07
     */
    public static String getLastDayOfMonthStr() {
        String dateFormat = FORMAT_DATE_YMD;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        Calendar lastDate = Calendar.getInstance();
        lastDate.set(Calendar.DATE, 1);// 设为当前月的1号
        lastDate.add(Calendar.MONTH, 1);// 加一个月，变为下月的1号
        lastDate.add(Calendar.DATE, -1);// 减去一天，变为当月最后一天

        return sdf.format(lastDate.getTime());
    }

    /**
     * @return String
     * @throws
     * @Title: getFirstDayOfPreviousMonth
     * @Description: 获得上月的第一天
     * @author georgeli
     * @date 2018年1月25日 下午5:01:15
     */
    public static String getFirstDayOfPreviousMonth() {
        String dateFormat = FORMAT_DATE_YMDHMS;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        Calendar lastDate = Calendar.getInstance();
        lastDate.set(Calendar.DATE, 1);// 设为当前月的1号
        lastDate.add(Calendar.MONTH, -1);// 变为当月的1号

        lastDate.set(Calendar.HOUR_OF_DAY, 0);
        lastDate.set(Calendar.MINUTE, 0);
        lastDate.set(Calendar.SECOND, 0);
        lastDate.set(Calendar.MILLISECOND, 0);
        // lastDate.add(Calendar.DATE, -1);//减去一天，变为当月最后一天

        return sdf.format(lastDate.getTime());
    }

    /**
     * @return String
     * @throws
     * @Title: getLastDayOfBeforeMonth
     * @Description: 获得当上月的最后一天
     * @author georgeli
     * @date 2018年1月25日 下午5:01:24
     */
    public static String getLastDayOfBeforeMonth() {
        String dateFormat = FORMAT_DATE_YMDHMS;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        Calendar lastDate = Calendar.getInstance();
        lastDate.set(Calendar.DATE, 1);// 设为当前月的1号
        lastDate.add(Calendar.MONTH, 0);// 变为当月的1号
        lastDate.add(Calendar.DATE, -1);// 减去一天，变为当月最后一天

        lastDate.set(Calendar.HOUR_OF_DAY, 23);
        lastDate.set(Calendar.MINUTE, 59);
        lastDate.set(Calendar.SECOND, 59);
        lastDate.set(Calendar.MILLISECOND, 999);

        return sdf.format(lastDate.getTime());
    }

    /**
     * @return String
     * @throws
     * @Title: getLastDayOfBeforeMonthYMD
     * @Description: 获得当上月的最后一天
     * @author georgeli
     * @date 2018年1月25日 下午5:01:33
     */
    public static String getLastDayOfBeforeMonthYMD() {
        String dateFormat = FORMAT_DATE_YMD;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        Calendar lastDate = Calendar.getInstance();
        lastDate.set(Calendar.DATE, 1);// 设为当前月的1号
        lastDate.add(Calendar.MONTH, 0);// 变为当月的1号
        lastDate.add(Calendar.DATE, -1);// 减去一天，变为当月最后一天

        return sdf.format(lastDate.getTime());
    }

    /**
     * @return String
     * @throws
     * @Title: getNowDate
     * @Description: 获取当天时间
     * @author georgeli
     * @date 2018年1月25日 下午5:01:44
     */
    public static String getNowDate() {
        String dateFormat = FORMAT_DATE_YMD;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        Calendar lastDate = Calendar.getInstance();

        return sdf.format(lastDate.getTime());
    }

    /**
     * @return String
     * @throws
     * @Title: getFileNowDate
     * @Description: 获取当前时间(文档)
     * @author georgeli
     * @date 2018年10月12日 下午2:20:59
     */
    public static String getFileNowDate() {
        String dateFormat = FILE_FORMAT_DATE_YMD;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        Calendar lastDate = Calendar.getInstance();

        return sdf.format(lastDate.getTime());
    }

    /**
     * @return Date
     * @throws
     * @Title: getFirstDayOfMonth
     * @Description: 获取当月第一天
     * @author georgeli
     * @date 2018年1月25日 下午5:01:53
     */
    public static Date getFirstDayOfMonth() {
        String dateFormat = FORMAT_DATE_YMD;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        Calendar lastDate = Calendar.getInstance();
        lastDate.set(Calendar.DATE, 1);// 设为当前月的1号
        return strToDate(sdf.format(lastDate.getTime()), dateFormat);
    }

    /**
     * @param i
     * @return String
     * @throws
     * @Title: getFirstDayOfTheMonth
     * @Description: 获取当月第一天
     * @author georgeli
     * @date 2018年1月25日 下午5:02:00
     */
    public static String getFirstDayOfTheMonth(int i) {
        String dateFormat = FORMAT_DATE_YMD;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        Calendar lastDate = Calendar.getInstance();
        lastDate.set(Calendar.DATE, 1 + i);// 设为当前月的1号
        return sdf.format(lastDate.getTime());
    }

    /**
     * @param i
     * @return String
     * @throws
     * @Title: getFirstDayOfTheBefordeMonth
     * @Description: 获取上月第一天
     * @author georgeli
     * @date 2018年1月25日 下午5:02:07
     */
    public static String getFirstDayOfTheBefordeMonth(int i) {
        String dateFormat = FORMAT_DATE_YMD;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        Calendar lastDate = Calendar.getInstance();
        lastDate.add(Calendar.MONTH, -1);// 变为上月
        lastDate.set(Calendar.DATE, 1 + i);
        return sdf.format(lastDate.getTime());
    }

    /**
     * @param dateformat
     * @return Date
     * @throws
     * @Title: getNowTime
     * @Description: 获取当天时间
     * @author georgeli
     * @date 2018年1月25日 下午5:02:15
     */
    public static Date getNowTime(String dateformat) {
        Date now = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat(dateformat);// 可以方便地修改日期格式
        return strToDate(dateFormat.format(now), dateformat);

    }

    /**
     * @param date
     * @return String
     * @throws
     * @Title: getStartTime
     * @Description: 获取当天的开始时间
     * @author georgeli
     * @date 2018年1月25日 下午5:02:22
     */
    public static String getStartTime(String date) {
        String dateFromFormat = FORMAT_DATE_YMD;
        String dateToFormat = FORMAT_DATE_YMDHMS;
        SimpleDateFormat dateFormatFrom = new SimpleDateFormat(dateFromFormat);
        SimpleDateFormat dateFormatTo = new SimpleDateFormat(dateToFormat);
        Calendar todayStart = Calendar.getInstance();
        try {
            Date parsedDate = dateFormatFrom.parse(date);

            todayStart.setTime(parsedDate);
            todayStart.set(Calendar.HOUR_OF_DAY, 0);
            todayStart.set(Calendar.MINUTE, 0);
            todayStart.set(Calendar.SECOND, 0);
            todayStart.set(Calendar.MILLISECOND, 0);

        } catch (ParseException ex) {
            ex.printStackTrace();// TODO
        }

        return dateFormatTo.format(todayStart.getTime());

    }

    /**
     * @param date
     * @param dateFromFormat
     * @param dateToFormat
     * @return String
     * @throws
     * @Title: getDayStartTime
     * @Description: 获取当天的开始时间
     * @author georgeli
     * @date 2018年1月25日 下午5:02:32
     */
    public static String getDayStartTime(String date, String dateFromFormat, String dateToFormat) {
        // String dateFromFormat = FORMAT_DATE_YMD;
        // String dateToFormat = FORMAT_DATE_YMDHMS;
        SimpleDateFormat dateFormatFrom = new SimpleDateFormat(dateFromFormat);
        SimpleDateFormat dateFormatTo = new SimpleDateFormat(dateToFormat);
        Calendar todayStart = Calendar.getInstance();
        try {
            Date parsedDate = dateFormatFrom.parse(date);

            todayStart.setTime(parsedDate);
            todayStart.set(Calendar.HOUR_OF_DAY, 0);
            todayStart.set(Calendar.MINUTE, 0);
            todayStart.set(Calendar.SECOND, 0);
            todayStart.set(Calendar.MILLISECOND, 0);

        } catch (ParseException ex) {
            ex.printStackTrace();// TODO
        }

        return dateFormatTo.format(todayStart.getTime());

    }

    /**
     * @param date
     * @return String
     * @throws
     * @Title: getEndTime
     * @Description: 获取当天的结束时间
     * @author georgeli
     * @date 2018年1月25日 下午5:02:40
     */
    public static String getEndTime(String date) {
        String dateFromFormat = FORMAT_DATE_YMD;
        String dateToFormat = FORMAT_DATE_YMDHMS;
        SimpleDateFormat dateFormatFrom = new SimpleDateFormat(dateFromFormat);
        SimpleDateFormat dateFormatTo = new SimpleDateFormat(dateToFormat);
        Calendar todayEnd = Calendar.getInstance();
        try {
            Date parsedDate = dateFormatFrom.parse(date);
            todayEnd.setTime(parsedDate);
            todayEnd.set(Calendar.HOUR_OF_DAY, 23);
            todayEnd.set(Calendar.MINUTE, 59);
            todayEnd.set(Calendar.SECOND, 59);
            todayEnd.set(Calendar.MILLISECOND, 999);
        } catch (ParseException ex) {
            ex.printStackTrace();// TODO
        }
        return dateFormatTo.format(todayEnd.getTime());
    }

    /**
     * @param date
     * @param dateFromFormat
     * @param dateToFormat
     * @return String
     * @throws
     * @Title: getDayEndTime
     * @Description: 获取当天的结束时间
     * @author georgeli
     * @date 2018年1月25日 下午5:02:47
     */
    public static String getDayEndTime(String date, String dateFromFormat, String dateToFormat) {
        // String dateFromFormat = FORMAT_DATE_YMD;
        // String dateToFormat = FORMAT_DATE_YMDHMS;
        SimpleDateFormat dateFormatFrom = new SimpleDateFormat(dateFromFormat);
        SimpleDateFormat dateFormatTo = new SimpleDateFormat(dateToFormat);
        Calendar todayEnd = Calendar.getInstance();
        try {
            Date parsedDate = dateFormatFrom.parse(date);
            todayEnd.setTime(parsedDate);
            todayEnd.set(Calendar.HOUR_OF_DAY, 23);
            todayEnd.set(Calendar.MINUTE, 59);
            todayEnd.set(Calendar.SECOND, 59);
            todayEnd.set(Calendar.MILLISECOND, 999);
        } catch (ParseException ex) {
            ex.printStackTrace();// TODO
        }
        return dateFormatTo.format(todayEnd.getTime());
    }

    /**
     * @param date
     * @return Date
     * @throws
     * @Title: getStartDate
     * @Description: 获取当天的开始时间
     * @author georgeli
     * @date 2018年1月25日 下午5:02:57
     */
    public static Date getStartDate(Date date) {
        Calendar todayStart = Calendar.getInstance();
        todayStart.setTime(date);
        todayStart.set(Calendar.HOUR_OF_DAY, 0);
        todayStart.set(Calendar.MINUTE, 0);
        todayStart.set(Calendar.SECOND, 0);
        todayStart.set(Calendar.MILLISECOND, 0);
        return todayStart.getTime();

    }

    /**
     * @param date
     * @return Date
     * @throws
     * @Title: getEndDate
     * @Description: 获取当天的结束时间
     * @author georgeli
     * @date 2018年1月25日 下午5:03:06
     */
    public static Date getEndDate(Date date) {
        Calendar todayEnd = Calendar.getInstance();
        todayEnd.setTime(date);
        todayEnd.set(Calendar.HOUR_OF_DAY, 23);
        todayEnd.set(Calendar.MINUTE, 59);
        todayEnd.set(Calendar.SECOND, 59);
        todayEnd.set(Calendar.MILLISECOND, 999);
        return todayEnd.getTime();
    }

    /**
     * @return Date
     * @throws
     * @Title: getYesterday
     * @Description: 得到昨天
     * @author georgeli
     * @date 2018年1月25日 下午5:03:13
     */
    public static Date getYesterday() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        return cal.getTime();
    }

    /**
     * @return String
     * @throws
     * @Title: getYesterdayStr
     * @Description: 得到昨天字符串
     * @author georgeli
     * @date 2018年1月25日 下午5:03:27
     */
    public static String getYesterdayStr() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        String yesterday = new SimpleDateFormat(FORMAT_DATE_YYMMDD).format(cal.getTime());
        return yesterday;
    }

    /**
     * @param date
     * @param diffDay
     * @return Date
     * @throws
     * @Title: computeDate
     * @Description: 计算日期
     * @author georgeli
     * @date 2018年1月25日 下午5:03:40
     */
    public static Date computeDate(Date date, int diffDay) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DAY_OF_MONTH, diffDay);
        date = c.getTime();
        return date;
    }

    /**
     * @param d
     * @return String
     * @throws
     * @Title: dateToString
     * @Description: 日期转字符串
     * @author georgeli
     * @date 2018年1月25日 下午5:03:53
     */
    public static String dateToString(Date d) {
        return dateToString(d, FORMAT_DATE_YMD);
    }

    /**
     * @param d
     * @param format
     * @return String
     * @throws
     * @Title: dateToString
     * @Description: 日期转字符串
     * @author georgeli
     * @date 2018年1月25日 下午5:04:07
     */
    public static String dateToString(Date d, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(d);
    }

    /**
     * @param dateStr
     * @return Date
     * @throws
     * @Title: strToDate
     * @Description: 字符串转日期
     * @author georgeli
     * @date 2018年1月25日 下午5:04:16
     */
    public static Date strToDate(String dateStr) {
        return strToDate(dateStr, "MM/dd/yyyy");
    }

    /**
     * @param dateStr
     * @return Date
     * @throws
     * @Title: strParseDate
     * @Description: 字符串转日期
     * @author georgeli
     * @date 2018年1月25日 下午5:04:29
     */
    public static Date strParseDate(String dateStr) {
        return strParseDate(dateStr, FORMAT_DATE_YMD);
    }

    /**
     * @param dateStr
     * @param format
     * @return Date
     * @throws
     * @Title: strToDate
     * @Description: 字符串转日期
     * @author georgeli
     * @date 2018年1月25日 下午5:04:38
     */
    public static Date strToDate(String dateStr, String format) {
        if (StringUtils.isEmpty(dateStr)) {
            return null;
        }
        SimpleDateFormat dateFmt = new SimpleDateFormat(format);

        dateFmt.setLenient(false);
        ParsePosition pos = new ParsePosition(0);
        return dateFmt.parse(dateStr, pos);
    }

    /**
     * @param dateStr
     * @param format
     * @return Date
     * @throws
     * @Title: strParseDate
     * @Description: 字符串转日期
     * @author georgeli
     * @date 2018年1月25日 下午5:04:45
     */
    public static Date strParseDate(String dateStr, String format) {
        if (StringUtils.isEmpty(dateStr)) {
            return null;
        }
        SimpleDateFormat dateFmt = new SimpleDateFormat(format);

        try {
            return dateFmt.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * @param date1
     * @param date2
     * @return boolean
     * @throws
     * @Title: compareDate
     * @Description: 比较日期
     * @author georgeli
     * @date 2018年1月25日 下午5:04:52
     */
    public static boolean compareDate(Date date1, Date date2) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FORMAT_DATE_YMD);
        return simpleDateFormat.format(date1).equals(simpleDateFormat.format(date2));
    }

    /**
     * @param date
     * @return String
     * @throws
     * @Title: getDayOfWeek
     * @Description: 得到周几
     * @author georgeli
     * @date 2018年1月25日 下午5:05:01
     */
    public static String getDayOfWeek(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
        String DayOfWeek = "";
        switch (dayOfWeek) {
            case 1: {
                DayOfWeek = "Sun";
                break;
            }
            case 2: {
                DayOfWeek = "Mon";
                break;
            }
            case 3: {
                DayOfWeek = "Tue";
                break;
            }
            case 4: {
                DayOfWeek = "Wed";
                break;
            }
            case 5: {
                DayOfWeek = "Thu";
                break;
            }
            case 6: {
                DayOfWeek = "Fri";
                break;
            }
            case 7: {
                DayOfWeek = "Sat";
                break;
            }
        }
        return DayOfWeek;
    }

    /**
     * @param date
     * @return Integer
     * @throws
     * @Title: getIndexOfDayOfWeek
     * @Description: 得到一周第几天
     * @author georgeli
     * @date 2018年1月25日 下午5:05:14
     */
    public static Integer getIndexOfDayOfWeek(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
        return dayOfWeek;
    }

    /**
     * @param date
     * @return Integer
     * @throws
     * @Title: getWeekOfYear
     * @Description: 得到一年中第几周
     * @author georgeli
     * @date 2018年1月25日 下午5:05:27
     */
    public static Integer getWeekOfYear(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal.get(Calendar.WEEK_OF_YEAR);
    }

    /**
     * @param date
     * @return boolean
     * @throws
     * @Title: checkTodayPassHalfMonth
     * @Description: 验证今天是否超过半个月
     * @author georgeli
     * @date 2018年1月25日 下午5:05:41
     */
    public static boolean checkTodayPassHalfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        if (day >= 15) {
            return true;
        }
        return false;
    }

    /**
     * @param date
     * @param amount
     * @return Date
     * @throws
     * @Title: addMinutes
     * @Description: 增加分
     * @author georgeli
     * @date 2018年1月25日 下午5:06:13
     */
    public static Date addMinutes(Date date, int amount) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.MINUTE, amount);
        return c.getTime();
    }

    /**
     * @param date
     * @param amount
     * @return Date
     * @throws
     * @Title: addHours
     * @Description: 增加小时
     * @author georgeli
     * @date 2018年1月25日 下午5:06:23
     */
    public static Date addHours(Date date, int amount) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.HOUR_OF_DAY, amount);
        return c.getTime();
    }

    /**
     * @param date
     * @param amount
     * @return Date
     * @throws
     * @Title: addDays
     * @Description: 增加天
     * @author georgeli
     * @date 2018年1月25日 下午5:06:31
     */
    public static Date addDays(Date date, int amount) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DAY_OF_MONTH, amount);
        return c.getTime();
    }

    /**
     * @param date
     * @param amount
     * @return Date
     * @throws
     * @Title: addMonths
     * @Description: 增加约
     * @author georgeli
     * @date 2018年1月25日 下午5:06:40
     */
    public static Date addMonths(Date date, int amount) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.MONTH, amount);
        return c.getTime();
    }

    /**
     * @param start
     * @param end
     * @param calendarType
     * @return Date[]
     * @throws
     * @Title: getDateArrays
     * @Description: 得到日期数组
     * @author georgeli
     * @date 2018年1月25日 下午5:06:48
     */
    public static Date[] getDateArrays(Date start, Date end, int calendarType) {
        ArrayList<Date> ret = new ArrayList<Date>();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(start);
        Date tmpDate = calendar.getTime();
        long endTime = end.getTime();
        while (tmpDate.before(end) || tmpDate.getTime() == endTime) {
            ret.add(calendar.getTime());
            calendar.add(calendarType, 1);
            tmpDate = calendar.getTime();
        }
        Date[] dates = new Date[ret.size()];
        return (Date[]) ret.toArray(dates);
    }

    /**
     * @return Date
     * @throws
     * @Title: getCurrYearFirst
     * @Description: 得到今年第一天
     * @author georgeli
     * @date 2018年1月25日 下午5:06:59
     */
    public static Date getCurrYearFirst() {
        Calendar currCal = Calendar.getInstance();
        int currentYear = currCal.get(Calendar.YEAR);
        return getYearFirst(currentYear);
    }

    /**
     * @param year
     * @return Date
     * @throws
     * @Title: getYearFirst
     * @Description: 得到今天第一天
     * @author georgeli
     * @date 2018年1月25日 下午5:07:10
     */
    public static Date getYearFirst(int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        Date currYearFirst = calendar.getTime();
        return currYearFirst;
    }

    /**
     * @return int
     * @throws
     * @Title: getCurrentYear
     * @Description: 得到当前年
     * @author georgeli
     * @date 2018年1月25日 下午5:07:30
     */
    public static int getCurrentYear() {
        Calendar currCal = Calendar.getInstance();
        int currentYear = currCal.get(Calendar.YEAR);
        return currentYear;

    }

    /**
     * @return int
     * @throws
     * @Title: getCurrentMonth
     * @Description: 得到当前月
     * @author georgeli
     * @date 2018年1月25日 下午5:07:53
     */
    public static int getCurrentMonth() {
        Calendar currCal = Calendar.getInstance();
        int currentMonth = currCal.get(Calendar.MONTH);
        return currentMonth + 1;
    }

    /**
     * @param d
     * @param day
     * @return Date
     * @throws
     * @Title: getDateBefore
     * @Description: 得到几天前的时间
     * @author georgeli
     * @date 2018年1月25日 下午5:08:07
     */
    public static Date getDateBefore(Date d, int day) {
        Calendar now = Calendar.getInstance();
        now.setTime(d);
        now.set(Calendar.DATE, now.get(Calendar.DATE) - day);
        return now.getTime();
    }

    /**
     * @param d
     * @param day
     * @return String
     * @throws
     * @Title: getDateAfter
     * @Description: 得到几天后的时间
     * @author georgeli
     * @date 2018年1月25日 下午5:08:14
     */
    public static String getDateAfter(Date d, int day) {

        String dateFormat = FORMAT_DATE_YMDHMS;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);

        Calendar now = Calendar.getInstance();
        now.setTime(d);
        now.set(Calendar.DATE, now.get(Calendar.DATE) + day);
        return sdf.format(now.getTime());
    }

    /**
     * @param timeOne
     * @param timeTwo
     * @return Long
     * @throws
     * @Title: getDiffMinute
     * @Description: 比较时间
     * @author georgeli
     * @date 2018年1月25日 下午5:08:21
     */
    public static Long getDiffMinute(Long timeOne, Long timeTwo) {
        return (timeOne - timeTwo) / (1000 * 60);
    }

    /**
     * 通过时间秒毫秒数判断两个时间的间隔
     *
     * @param date1
     * @param date2
     * @return
     */
    public static int getDiffDays(Date date1, Date date2) {
        int days = (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24));
        return days;
    }

    /**
     * String 日期转long
     *
     * @param strTime
     * @param formatType
     * @return
     * @throws ParseException
     */
    public static long stringToLong(String strTime, String formatType) {
        try {
            Date date = stringToDate(strTime, formatType); // String类型转成date类型
            if (date == null) {
                return 0;
            } else {
                return dateToLong(date);
            }
        } catch (Exception e) {
            return 0;
        }
    }

    /**
     * String 转 date
     *
     * @param strTime
     * @param formatType
     * @return
     * @throws ParseException
     */
    public static Date stringToDate(String strTime, String formatType) throws ParseException {
        SimpleDateFormat formatter = new SimpleDateFormat(formatType);
        Date date = null;
        date = formatter.parse(strTime);
        return date;
    }

    /**
     * date 转long
     *
     * @param date
     * @return
     */
    public static long dateToLong(Date date) {
        return date.getTime();
    }

    /**
     * long 转 date
     *
     * @param currentTime
     * @param formatType
     * @return
     * @throws ParseException
     */
    public static Date longToDate(long currentTime, String formatType)
            throws ParseException {
        Date dateOld = new Date(currentTime); // 根据long类型的毫秒数生命一个date类型的时间
        String sDateTime = dateToString(dateOld, formatType); // 把date类型的时间转换为string
        Date date = stringToDate(sDateTime, formatType); // 把String类型转换为Date类型
        return date;
    }

    /**
     * 生日转年龄
     *
     * @param birthday
     * @return
     */
    public static int getAgeByBirth(Date birthday) {
        int age = 0;
        try {
            Calendar now = Calendar.getInstance();
            now.setTime(new Date());// 当前时间

            Calendar birth = Calendar.getInstance();
            birth.setTime(birthday);

            if (birth.after(now)) {//如果传入的时间，在当前时间的后面，返回0岁
                age = 0;
            } else {
                age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR);
                if (now.get(Calendar.DAY_OF_YEAR) > birth.get(Calendar.DAY_OF_YEAR)) {
                    age += 1;
                }
            }
            return age;
        } catch (Exception e) {//兼容性更强,异常后返回数据
            return 0;
        }
    }

    /**
     * 获取两个日期之间的日期
     *
     * @param start 开始日期
     * @param end   结束日期
     * @return 日期集合
     */
    public static List<String> getBetweenDates(Date start, Date end) {
        List<String> result = new ArrayList<>();
        Calendar tempStart = Calendar.getInstance();
        tempStart.setTime(start);
        // 时
        tempStart.set(Calendar.HOUR_OF_DAY, 0);
        // 分
        tempStart.set(Calendar.MINUTE, 0);
        // 秒
        tempStart.set(Calendar.SECOND, 0);
        // 毫秒
        tempStart.set(Calendar.MILLISECOND, 0);

        tempStart.add(Calendar.DAY_OF_YEAR, 1);

        Calendar tempEnd = Calendar.getInstance();
        tempEnd.setTime(end);
        // 时
        tempEnd.set(Calendar.HOUR_OF_DAY, 0);
        // 分
        tempEnd.set(Calendar.MINUTE, 0);
        // 秒
        tempEnd.set(Calendar.SECOND, 0);
        // 毫秒
        tempEnd.set(Calendar.MILLISECOND, 0);
        while (tempStart.before(tempEnd)) {
            result.add(format(tempStart.getTime(), FORMAT_DATE_YMD));
            tempStart.add(Calendar.DAY_OF_YEAR, 1);
        }
        return result;
    }

    /**
     * 获取当天的开始时间
     *
     * @return
     */
    public static Date getCurrentDate() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        Date zero = calendar.getTime();
        return zero;
    }

    /**
     * 校验日期是否合法
     *
     * @param date
     * @param patten
     * @return
     */
    public static boolean isValidDate(String date, String patten) {
        //括号内为日期格式，y代表年份，M代表年份中的月份（为避免与小时中的分钟数m冲突，此处用M），d代表月份中的天数
        SimpleDateFormat sd = new SimpleDateFormat(patten);
        try {
            //此处指定日期/时间解析是否不严格，在true是不严格，false时为严格
            sd.setLenient(false);
            //从给定字符串的开始解析文本，以生成一个日期
            sd.parse(date);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public static void main(String[] args) {
        String patten = "yyyy-MM-dd";
        String date = "2018-11-11";
        System.out.println(isValidDate(date, patten));
    }

}
